<?php

final class Singleton
{
    /**
     * @var Singleton
     */
    private static $instance;

    /**
     * 通过懒加载获得实例（在第一次使用的时候创建）
     */
    public static function getInstance()
    {
        if (null === static::$instance) {
            static::$instance = new static;
        }
        return static::$instance;
    }

    /**
     * 不允许从外部调用以防止创建多个实例
     * 要使用单例，必须通过 Singleton::getInstance() 方法获取实例
     */
    private function __construct()
    {
        error_log('Creating database connection instance');
    }

    /**
     * 防止实例被克隆（这会创建实例的副本）
     */
    private function __clone()
    {
    }

    /**
     * 防止反序列化（这将创建它的副本）
     */
    private function __wakeup()
    {
    }

}

$firstCall = Singleton::getInstance();
//单例模式 在应用程序调用的时候，只能获得一个对象实例。
/*
   用途：
    数据库连接
        在应用程序中，频繁地创建和关闭数据库连接是低效且资源消耗大的。使用单例模式创建一个数据库连接管理器，可以确保始终只有一个连接实例被使用，避免了重复创建连接的开销。
    线程池:在多线程环境中，管理有限数量的线程资源时，单例模式可以确保只有一个线程池实例存在，避免资源的重复创建和管理混乱。
    全局缓存
注释：php单例模式无法保证线程安全，可以加锁解决;
 */